import { SidebarLightThemeEnum } from '@/enums/settings/ThemeEnum';

// // 辅助函数：将十六进制颜色转换为 RGB
// function hexToRgb(hex: string): [number, number, number] {
//   const bigint = parseInt(hex.slice(1), 16);
//   return [(bigint >> 16) & 255, (bigint >> 8) & 255, bigint & 255];
// }

// 辅助函数：将颜色字符串转换为 RGB
function parseColor(color: string): [number, number, number] {
  // 处理 hex 格式（包含 3 位和 6 位）
  if (color.startsWith('#')) {
    let hex = color.slice(1);
    // 如果是 3 位简写，扩展为 6 位
    if (hex.length === 3) {
      hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
    }
    const bigint = parseInt(hex, 16);
    return [(bigint >> 16) & 255, (bigint >> 8) & 255, bigint & 255];
  }

  // 处理 rgb/rgba 格式
  if (color.startsWith('rgb')) {
    const values = color.match(/\d+/g);
    if (values && values.length >= 3) {
      return [parseInt(values[0]), parseInt(values[1]), parseInt(values[2])];
    }
  }

  // 处理 hsl/hsla 格式
  if (color.startsWith('hsl')) {
    const values = color.match(/[\d.]+/g);
    if (values && values.length >= 3) {
      return hslToRgb(parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]));
    }
  }

  // 默认返回黑色
  return [0, 0, 0];
}

// HSL 转换函数
function hslToRgb(h: number, s: number, l: number): [number, number, number] {
  h /= 360;
  s /= 100;
  l /= 100;

  const a = s * Math.min(l, 1 - l);
  const f = (n: number) => {
    const k = (n + h * 6) % 6;
    return l - a * Math.max(Math.min(k, 4 - k, 1), 0);
  };
  return [Math.round(f(5) * 255), Math.round(f(3) * 255), Math.round(f(1) * 255)];
}

// 辅助函数：将 RGB 转换为十六进制颜色
function rgbToHex(r: number, g: number, b: number): string {
  return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
}

/**
 * 加深颜色值
 * @param {String} color 颜色值字符串
 * @param {Number} level 加深的程度，限0-1之间
 * @returns {String} 返回处理后的颜色值
 */
export function getDarkColor(color: string, level: number): string {
  const rgb = parseColor(color);
  for (let i = 0; i < 3; i++) rgb[i] = Math.round(20.5 * level + rgb[i] * (1 - level));
  return rgbToHex(rgb[0], rgb[1], rgb[2]);
}
/**
 * 变浅颜色值
 * @param {String} color 颜色值字符串
 * @param {Number} level 加深的程度，限0-1之间
 * @returns {String} 返回处理后的颜色值
 */
export const getLightColor = (color: string, level: number): string => {
  const rgb = parseColor(color);
  for (let i = 0; i < 3; i++) rgb[i] = Math.round(255 * level + rgb[i] * (1 - level));
  return rgbToHex(rgb[0], rgb[1], rgb[2]);
};

/**
 * 生成主题色
 * @param primary 主题色
 * @param theme 主题类型
 */
export function generateThemeColors(primary: string, theme: string) {
  const colors: Record<string, string> = { primary };
  // 生成浅色变体
  for (let i = 1; i <= 9; i++) {
    const primaryColor = theme === 'light' ? `${getLightColor(primary, i / 10)}` : `${getDarkColor(primary, i / 10)}`;
    colors[`primary-light-${i}`] = primaryColor;
  }
  // 生成深色变体
  colors['primary-dark-2'] = theme === 'light' ? `${getLightColor(primary, 0.2)}` : `${getDarkColor(primary, 0.3)}`;
  return colors;
}

/**
 * 设置主题色
 * @param colors 主题色
 */
export function applyTheme(colors: Record<string, string>) {
  const el = document.documentElement;
  Object.entries(colors).forEach(([key, value]) => {
    el.style.setProperty(`--el-color-${key}`, value);
  });
}

/**
 * 设置侧边栏宽度
 * @param width 侧边栏宽
 */
export function applySidebarWidth(width: number) {
  document.documentElement.style.setProperty('--sidebar-width', `${width}px`);
}

/**
 * 设置标签栏高度 方便组件计算页面高度
 * @param tagsView 设置标签栏
 */
export function applyTagsViewHeight(tagsView: boolean) {
  // 获取标签栏默认高度
  const tagsViewHeight = tagsView
    ? getComputedStyle(document.documentElement).getPropertyValue('--tags-view-default-height')
    : '0px';
  document.documentElement.style.setProperty('--tags-view-height', tagsViewHeight);
}

/**
 * 设置圆角风格角度
 * @param borderRadius 圆角风格角度
 */
export function applyBorderRadius(radius: number) {
  document.documentElement.style.setProperty('--border-radius', `${radius}px`);
  document.documentElement.style.setProperty('--el-border-radius-base', `${radius}px`);
}

/**
 * 设置文本增强
 * @param textEnhance 文字增强
 */
export function applyTextEnhance(isTextEnhance: boolean) {
  if (isTextEnhance) {
    document.documentElement.classList.add('text-enhance');
  } else {
    document.documentElement.classList.remove('text-enhance');
  }
}

/**
 * 切换暗黑模式
 * @param isDark 是否启用暗黑模式
 */
export function toggleDarkMode(isDark: boolean) {
  if (isDark) {
    document.documentElement.classList.add('dark');
  } else {
    document.documentElement.classList.remove('dark');
  }
}

/**
 * 切换灰色模式
 * @param isGray 是否启用灰色模式
 */
export function toggleGrayMode(isGray: boolean) {
  if (isGray) {
    document.documentElement.classList.add('gray-mode');
  } else {
    document.documentElement.classList.remove('gray-mode');
  }
}
/**
 * 切换反色模式
 * @param isGray 是否启用反色模式
 */
export function toggleInvertMode(isInvert: boolean) {
  if (isInvert) {
    document.documentElement.classList.add('invert-mode');
  } else {
    document.documentElement.classList.remove('invert-mode');
  }
}

/**
 * 切换浅色主题下的侧边栏颜色方案
 * @param isBlue 布尔值，表示是否开启深蓝色侧边栏颜色方案
 */
export function toggleLightModeSidebarColorScheme(isDarkBlueDark: boolean) {
  if (isDarkBlueDark) {
    document.documentElement.classList.add(SidebarLightThemeEnum.DARKBLUE);
  } else {
    document.documentElement.classList.remove(SidebarLightThemeEnum.DARKBLUE);
  }
}
